/*
Copyright SecureKey Technologies Inc. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/
package core

import (
	"crypto"
	"hash"
)

// CryptoSuite sdk加密工具的抽象接口，支持sw非国密和gm国密
type CryptoSuite interface {
	// KeyGen 根据选项生成密钥
	KeyGen(opts KeyGenOpts) (k Key, err error)
	// KeyImport 导入密钥
	KeyImport(raw interface{}, opts KeyImportOpts) (k Key, err error)
	// GetKey 根据ski获取密钥对象
	GetKey(ski []byte) (k Key, err error)
	// Hash 计算hash
	Hash(msg []byte) (hash []byte, err error)
	// GetHash 获取hash函数
	GetHash() (h hash.Hash, err error)
	// Sign 使用指定的密钥进行签名
	Sign(k Key, digest []byte, opts SignerOpts) (signature []byte, err error)
	// Verify 验证签名是否正确
	Verify(k Key, signature, digest []byte, opts SignerOpts) (valid bool, err error)
	// IsGM 加密方式是否为国密
	IsGM() bool
}

// Key 密钥的抽象接口
type Key interface {
	// Bytes 密钥字节码
	Bytes() ([]byte, error)
	// SKI 密钥的主题标识
	SKI() []byte
	// PublicKey 返回对应的公钥
	PublicKey() (Key, error)
}

// HashOpts hash选择项，指定hash算法
type HashOpts interface {
	Algorithm() string
}

// SignerOpts 签名选择项，目前不生效
type SignerOpts interface {
	crypto.SignerOpts
}

// KeyImportOpts 导入密钥选择项，可选算法以及是否保存密钥，对导入来说保存不生效
type KeyImportOpts interface {
	Algorithm() string
	IsEphemeral() bool
}

// KeyGenOpts 指定算法生成密钥对，可保存生成的密钥
type KeyGenOpts interface {
	Algorithm() string
	IsEphemeral() bool
}
